CycleChecking

導入

v3.5

カテゴリ

operator

詳細

オペレータ評価サイクルのグラフを確認します。 評価サイクルとは、そのサイクル自体によって計算が変わるループ グラフの依存関係です。

この機能は、指定の階層にサイクルがあるかどうかを識別し、サイクル内のオペレータまたはサイクル内でデータにアクセスしているオペレータをスクリプト ウィンドウに出力します。 チェックの終了したサイクルごとに、「Cycle Breaking Point」というオペレータ名がスクリプト ウィンドウに出力され、「Cycle through」オペレータとラベルの付けられたオペレータ名が多数出力されます。

「Cycle Breaking Point」オペレータは、グラフにおける評価チェックの終了位置です。 評価が開始された位置に応じて、ブレーキング ポイントの位置はわずかに変化することがあります。 ブレ-キング ポイントは、グラフ内で問題のあるサイクルにおいて、シーン評価の相違、予期せぬ結果や動作をユーザが確認する上で重要となります。 なぜならば、接続スタック内におけるブレーキング ポイントの位置によっては、評価要求の結果を得るためにデータが使用するループが無限ループに陥ってしまうためです。 実際の結果は、サイクル自身の再評価にはなりません。

「Cycle through」オペレータもサイクルに影響を及ぼすオペレータであり、このオペレータの重要な依存関係が 1 つでも壊れると、依存関係サイクルも壊れます。 注: このサイクルにアクセスするオペレータはほかにも存在し、シーンの評価時にサイクルを不安定にすることがあります。しかしその影響は小さく、このようなオペレータが1つ削除されてもサイクルは壊れません。

ユーザが検索するサイクルを修正するには、サイクル内の重要な因子を特定し、削除します。 これを実行する上で推奨される方法があります。 まず、ブレーキング ポイントを孤立させてそのサイクルを再実行し、周期オペレータ内でデータがその階層に属しているのか、または他の階層のデータであるのかを確認し、サイクルの深さと幅のハンドルを取得します。 次に、サイクル内でラベルが付いている重要な因子を探します。 これを実行するには、「Cycle Breaking Point」で開始し、「Cycle through」のラベルが付いた同一の「Cycle Breaking Point」オペレータが見つかるまで、「Cycle through」オペレータ内の出力を辿ります。 これらのオペレータが因子です。 次に、「Expression」、「ScriptedOp」、「kine.Constraints」など、馴染みのあるサイクル作成因子を調べます。 問題を含むサイクルの重要な因子の書式は、「kine.local.PoseCompensatorOp」、「kine.global.ParentPoseCns_E」、「kine.local.ParentPoseAndPoseCns_D」、または「kine.global.SkeletonCtrlOpProp」ではありません。 注: "*_D"および"*_E"のラベルが付いているオペレータは、それぞれ"kine.Constraints"の定義オペレータと実行オペレータです。

サイクルのチェックは複数の方法でカスタマイズできます。

ヒント 1: サイクルの現在のフレームのみをチェックするには、Check Current FrameパラメータをTrueに設定できます。 コンストレイントのいずれかがサイクルのオン/オフがアニメートするサイクルに組み込まれている場合は特に有効です。

ヒント 2: スクリプトからこのコマンドを実行する場合は、CycleChecking コマンドを実行する前に Refresh コマンドを実行すると、確実にタイムフレームの現在の値を最新の値にすることができます。

ヒント 3: ユーザ設定の[Disable cycle checking when applying animation operators]をオンにし、FollowCycleCheckUserPrefパラメータをTrueに設定すると、パフォーマンスを最大限に引き出せます。 デフォルト値のまま(False)にしておくと、このコマンドはユーザ設定とは無関係にサイクル チェックを実行します。

ヒント 4: デフォルトでは、サイクルチェッカーは下の階層も含めて全体をチェックします。最初は、StartingGraphPtパラメータに指定されているシーンエレメントからチェックを開始します。 StartingGraphPt エレメントのみをチェックするには、CheckFullNestedHier フラグを False に設定します。

注: このコマンドは、出力引数を使用します。 C# および一部のスクリプト言語(JScript、PerlScript、Python など)は、リファレンスによって渡される引数をサポートしていません。 通常、出力引数は XSIApplication.ExecuteCommand メソッド(C#)または ISIVTCollection (スクリプト言語)を介して取得できますが、このコマンドはすでに値を返しています。

この場合の唯一の回避策は、出力引数と戻り値の両方を 1 つの配列で戻す VBScript のカスタム コマンドを作成することです。 詳細については、「関数がすでに値を戻している場合の処理について」を参照してください。

スクリプト構文

oBoolean = CycleChecking( [StartingGraphPt], [Check Current Frame], IsCycle, [DisableCycleCheck], [CheckFullNestedHier], [OutputObjs] );

戻り値

サイクルチェックの結果をブールとして戻します(サイクルが存在する場合はTrue)。

パラメータ

パラメータ タイプ 詳細
StartingGraphPt 文字列 サイクル チェックを開始するオブジェクト(開始ポイント)。

デフォルト値: 現在選択されている値

Check Current Frame ブール True の場合、サイクルの現在のフレームのみをチェックします。

デフォルト値: false

IsCycle ブール サイクルがある場合は True
DisableCycleCheck ブール ユーザ設定をチェックし、サイクル チェックが有効であるかどうかを確認します。

デフォルト値: false

CheckFullNestedHier ブール 有効にすると、下の階層も含め階層全体をチェックされます。 無効にすると、指定のオブジェクトのみがチェックされます。

デフォルト値: true

OutputObjs Operator オブジェクトの XSICollection サイクル内の出力。

1. VBScript の例

' Example: A cyclical expression
NewScene
CreatePrim "Sphere", "MeshSurface"
Translate , -7.20756310877914, 2.07707676083662, -0.207707676083662, siRelative, siView, siObj, siXYZ
GetPrim "Null"
Translate , 3.82040230356053, 0.744612423696161, -7.44612423696161E-02, siRelative, siView, siObj, siXYZ
SelectObj "sphere", , True
InspectObj "sphere.kine.local"
AddExpr "sphere.kine.local.posy"
SelectObj "null", , True
SetExpr "sphere.kine.local.posy", "null.kine.posy"
Translate , 0.118156772275078, 0.235140765377718, -2.35140765377718E-02, siRelative, siView, siObj, siXYZ
AddExpr "null.kine.local.posy"
SetExpr "null.kine.local.posy", "sphere.kine.posy"
Translate , 0.669555043461009, 1.01894331750266, -0.101894331750266, siRelative, siView, siObj, siXYZ
Translate , -0.712516724951656, 1.96939066659309, -0.196939066659309, siRelative, siView, siObj, siXYZ
Dim bCycle
bCycle = CycleChecking( "Scene_Root" )
Logmessage  bCycle
' The output is:
'WARNING : "3000 - Cycle Breaking Point sphere.kine.local.pos.posy.Expression"
'WARNING : "3000 - Cycle through sphere.kine.global.ParentPoseCns_E"
'WARNING : "3000 - Cycle through sphere.kine.local.PoseCompensatorOp"
'WARNING : "3000 - Cycle through null.kine.local.pos.posy.Expression"
'WARNING : "3000 - Cycle through null.kine.global.ParentPoseCns_E"
'WARNING : "3000 - Cycle through null.kine.local.PoseCompensatorOp"
'WARNING : "3000 - Cycle through sphere.kine.local.pos.posy.Expression"
'WARNING : "3000 - PROBLAMATIC EVALUATION CYCLES ARE IN THE SPECIFIED GRAPH"
'CycleChecking "Scene_Root"
'INFO : "True"

2. VBScript の例

' Example: A cyclical constraint
NewScene
CreatePrim "Cube", "MeshSurface"
Translate , -7.75896137939607, -0.235140765377774, 2.35140765377774E-02, siRelative, siView, siObj, siXYZ
CreatePrim "Sphere", "MeshSurface"
Translate , 8.12409703994715, -0.284640094775458, 2.84640094775458E-02, siRelative, siView, siObj, siXYZ
ApplyCns "Pose", "sphere", "cube"
SelectObj "cube", , True
ApplyCns "Position", "cube", "sphere"
SelectObj "Scene_Root"
Dim bCycle
bCycle = CycleChecking( "Scene_Root" )
Logmessage  bCycle
' The output is:
'WARNING : "3000 - Cycle Breaking Point cube.kine.global.IndpCns_E"
'WARNING : "3000 - Cycle through sphere.kine.Constraints.posecns.blends.PosePoseCns_D"
'WARNING : "3000 - Cycle through sphere.kine.global.PoseCns_E"
'WARNING : "3000 - Cycle through cube.kine.Constraints.poscns.blends.PosePoseCns_D"
'WARNING : "3000 - Cycle through cube.kine.global.IndpCns_E"
'WARNING : "3000 - Cycle through cube.kine.local.PoseCompensatorOp"
'WARNING : "3000 - Cycle through sphere.kine.local.PoseCompensatorOp"
'WARNING : "3000 - PROBLAMATIC EVALUATION CYCLES ARE IN THE SPECIFIED GRAPH"
'CycleChecking "Scene_Root"
'INFO : "True"